﻿Imports System.IO
Imports System.Data  
Imports System.Text  
Imports System.Collections.Generic

Public Class CSOrdMarketListed

 Public Const FUNCIONALIDAD_ETO_LISTED As Integer   = 37
 
 
 Private Const MODO_CANTIDAD   As String   = "N"
 Private Const MODO_COTIZACION As String   = "P"
 
 Private Const __ENTITE__          As String = "ID_XACT"
 Private Const __BROKER__          As String = "TRASPEST"
 Private Const __DESCRIPCION_FUN__ As String = "ELIMINA_TRIPLICADO"

 Private Const __TIPO_TRAN_TEA__     As String = "TEA"
 Private Const __TIPO_TRAN_TEC__     As String = "TEC"


Private ValoresDefault     As CTOrdenMarketListed 
Private ValoresPermitidos  As List(Of CTValidacionETO)    
Private layoutTloader      As new Dictionary(Of String,Integer) 


Private  NOMBRE_ARCHIVO_TL    As String 
Private  RUTA_ARCHIVO_TL      As String 
Private  COMANDO_TLOADER      As String 
Private  PARAMETROS_TLOADER   As String 



  Public Enum CATALOGOORDMARKETLISTED
    TIPO_TRANSACCION = 15
    MODO_COTIZACION  = 16
    MODO_CANTIDAD    = 17
    BROKERS          = 18
  End Enum
  


 Public Sub new()
  ValoresDefault    = New CTOrdenMarketListed ()
  ValoresPermitidos = New List(Of CTValidacionETO)
  CargarValoresDefault()


  NOMBRE_ARCHIVO_TL   = CServicioLocalSQLServerDB.ObtenerNombreArchivoTLTranListed ()
  RUTA_ARCHIVO_TL     = CServicioLocalSQLServerDB.ObtenerRutaArchivoTLTranListed ()
  COMANDO_TLOADER     = CServicioLocalSQLServerDB.ObtenerNombreArchivoTLoaderTranListed()
  PARAMETROS_TLOADER  = CServicioLocalSQLServerDB.ObtenerParametrosTLoaderTranListed()


  layoutTloader.Add("PF_COD" ,12)
  layoutTloader.Add("INST_ACR",16)
  
End Sub




Private  Function ObtenerValoresPermitidos() As Boolean 
   Dim dt As DataTable  = Nothing 
   Try
       dt =  CServicioLocalSQLServerDB.ObtienerInfoValidacionETO() 
   Catch ex As Exception
       Return false
   End Try
   
   For Each reg As DataRow In dt.Rows 

       Dim val = New  CTValidacionETO ()

       val.IDCat       = reg("ID_CAT")
       val.Clave       = reg("CLAVE")
       val.Valor       = reg("VALOR")
       val.EsDefault   = reg("VAL_DEFAULT")

       ValoresPermitidos.Add (val)

   Next

   Return true       

End Function


Public Sub CargarValoresDefault ()
   
            
   ValoresDefault.Portafolio  = ""
   ValoresDefault.Instrumento = ""
   ValoresDefault.Precio = 0
   ValoresDefault.CantidadTit = 0 
   ValoresDefault.Strategia = ""
 
   Try 
       ValoresDefault.FecTran  =  CServiciosMacrosSyBaseDB.FechaHoyDB ().ToString ("dd-MM-yyyy") 
       ValoresDefault.FecLiq   = ValoresDefault.FecTran 
   Catch ex As Exception
       ValoresDefault.FecTran  = Date.Now.ToString ("dd-MM-yyyy") 
       ValoresDefault.FecLiq   = Date.Now.ToString ("dd-MM-yyyy") 
   End Try
   

   If ObtenerValoresPermitidos() = True then 
        
      Dim valTranType    As CTValidacionETO  =    ValoresPermitidos.Find (Function (x) x.IDCat = CATALOGOORDMARKETLISTED.TIPO_TRANSACCION and x.EsDefault  = True  )
      Dim valBroker      As CTValidacionETO  =    ValoresPermitidos.Find (Function (x) x.IDCat = CATALOGOORDMARKETLISTED.BROKERS  and x.EsDefault  = True  )
      Dim valQuoteMode   As CTValidacionETO  =    ValoresPermitidos.Find (Function (x) x.IDCat = CATALOGOORDMARKETLISTED.MODO_COTIZACION   and x.EsDefault  = True  )
      Dim valQtyExp      As CTValidacionETO  =    ValoresPermitidos.Find (Function (x) x.IDCat = CATALOGOORDMARKETLISTED.MODO_CANTIDAD    and x.EsDefault  = True  )

      If Not valTranType is Nothing then
         ValoresDefault.TipoTran = valTranType.Valor 
      Else
         ValoresDefault.TipoTran  = ""
      End If

      If Not valBroker is Nothing then
         ValoresDefault.Broker  = valBroker.Valor 
      Else
         ValoresDefault.Broker  = __BROKER__ 
      End If

      If Not valQuoteMode is Nothing then
         ValoresDefault.QuoteMode   = valQuoteMode.Valor 
      Else
         ValoresDefault.QuoteMode   = MODO_COTIZACION 
      End If

      If Not valQtyExp is Nothing then
         ValoresDefault.QtyExpresion   = valQtyExp.Valor 
      Else
         ValoresDefault.QtyExpresion  = MODO_CANTIDAD 
      End If

   else

       ValoresDefault.TipoTran     = ""
       ValoresDefault.Broker       = __BROKER__
       ValoresDefault.QuoteMode    = MODO_COTIZACION 
       ValoresDefault.QtyExpresion = MODO_CANTIDAD 

   End If
    
       
End Sub


Public Function ObtenerRegistroDefaultDeOrdMarketListed() As CTOrdenMarketListed 
    Dim OML = New  CTOrdenMarketListed()

    OML.Portafolio    = ValoresDefault.Portafolio 
    OML.Instrumento   = ValoresDefault.Instrumento 
    OML.Precio        = ValoresDefault.Precio 
    OML.CantidadTit   = ValoresDefault.CantidadTit 
    OML.TipoTran      = ValoresDefault.TipoTran 
    OML.Strategia     = ValoresDefault.Strategia 
    OML.FecTran       = ValoresDefault.FecTran 
    OML.FecLiq        = ValoresDefault.FecLiq 
    OML.Broker        = ValoresDefault.Broker 

    OML.QuoteMode     = ValoresDefault.QuoteMode 
    OML.QtyExpresion  = ValoresDefault.QtyExpresion 

    Return OML
End Function



#Region "Procesamiento de transacciones LISTED"


Public Function ObtenerEstrategiasExistentes() As List(Of String)

 Dim lstEstrategias as List(Of String ) = New List(Of String )
 Dim dtEstrategias  As DataTable = Nothing 

 Try
   dtEstrategias = CServiciosMacrosSyBaseDB.ObtenerEstrategiasAAA()

   For Each estrategia As DataRow In dtEstrategias.Rows       
     lstEstrategias.Add (estrategia ("CODIF_COD"))
   Next

   Return lstEstrategias 

 Catch ex As Exception
   Return New List(Of String )
 End Try

End Function


Public Function ObtenerPORTAFOLIOSExistentes() As List(Of String)

 Dim lstPortafolios as List(Of String ) = New List(Of String )
 Dim dtPortafolios  As DataTable = Nothing 

 Try
   dtPortafolios = CServiciosMacrosSyBaseDB.ObtenerContratosAAA(Nothing)

   For Each estrategia As DataRow In dtPortafolios.Rows       
     lstPortafolios.Add (estrategia ("PF_COD"))
   Next

   Return lstPortafolios 

 Catch ex As Exception
   Return New List(Of String )
 End Try

End Function



 
Public Function ValidarInfoEntrada(ByRef lstTransacciones As List(Of CTOrdenMarketListed), ByRef numEstrategiasDesconocidas As Integer, ByRef sMsgError As String) As Boolean 

  Dim sMsgValidacion As New StringBuilder ()
  Dim lstTransaccion As List(Of CTValidacionETO)  
  Dim lstStrategias  As List(Of String) 

  Dim lstPortafolios = new  List(Of String) 


  Dim numMensajesError    As Integer  = 0 
      numEstrategiasDesconocidas      = 0 




    Try

      

        lstTransaccion = ValoresPermitidos.FindAll (Function (x) x.IDCat = CATALOGOORDMARKETLISTED.TIPO_TRANSACCION )
        lstStrategias  = ObtenerEstrategiasExistentes()
        lstPortafolios = ObtenerPORTAFOLIOSExistentes()


         For Each transaccion As CTOrdenMarketListed In lstTransacciones 

            
           'Portafolio
           If transaccion.Portafolio.Trim.Equals ("") then 
              sMsgValidacion.Append ("Portafolio vacio, ")
              numMensajesError += 1
           Else 
              If transaccion.Portafolio.Length > layoutTloader("PF_COD") then 
                 sMsgValidacion.Append ("Longitud de Portafolio incorrecta, ")
                 numMensajesError += 1
               else
                  Dim portafolioEnproc As String = transaccion.Portafolio.Trim
                  Dim portafolioobtenido As String = Nothing 
                  portafolioobtenido =  lstPortafolios.Find (Function (x) x.Trim.Equals(portafolioEnproc))
                  If portafolioobtenido is Nothing then 
                     sMsgValidacion.Append ("%El Portafolio no existe en Decalog%, ")
                     numMensajesError += 1
                  End If
              End If
           End If

           
            'Instrumento
           If transaccion.Instrumento.Trim.Equals ("") then 
              sMsgValidacion.Append ("Instrumento vacio, ")
              numMensajesError += 1
           Else 
              If transaccion.Instrumento.Replace ("_","").Length > layoutTloader("INST_ACR") then 
                 sMsgValidacion.Append ("Longitud de Instrumento incorrecta, ")
                 numMensajesError += 1
              End If
           End If


           'Precio
           If not IsNumeric (transaccion.Precio) then 
              sMsgValidacion.Append ("El Precio deber ser un múmero, ")
           End If


           'Cantidad      
           If not IsNumeric (transaccion.CantidadTit) then 
              sMsgValidacion.Append ("Cantidad deber ser un múmero, ")
              numMensajesError += 1
           End If
           


           'Tipo de transacción

           Dim tipoTran As String = transaccion.TipoTran  
           Dim objTupoTran As CTValidacionETO =  lstTransaccion.Find(Function (x) x.Valor.Equals (tipoTran)) 

           If objTupoTran is Nothing then 
              sMsgValidacion.Append ("Tipo de transacción incorrecta, ")
              numMensajesError += 1
           End If

             
           'Broker      
           If transaccion.Broker.trim.Equals("") then 
              sMsgValidacion.Append ("Broker vacio (se sugiere:" & ValoresDefault.Broker & "), ")
              numMensajesError += 1
           End If
                               
           'Fehca Tran 
           If not IsDate ( transaccion.FecTran  ) then 
              sMsgValidacion.Append ("Fecha operación (formato incorrecto), ")
              numMensajesError += 1
           End If



           'Fehca Liq
           If not IsDate ( transaccion.FecLiq   ) then 
              sMsgValidacion.Append ("Fecha liquidación (formato incorrecto), ")
              numMensajesError += 1
           End If



           If not transaccion.Strategia.Trim.Equals ("") then
              
              Dim estrategia As String = transaccion.Strategia  
              Dim estrategiaCoincidente As String = Nothing 
              estrategiaCoincidente = lstStrategias.Find(Function(x) x.Equals (estrategia))

              If estrategiaCoincidente is Nothing then 
                 sMsgValidacion.Append ("%La estrategia no existe en Decalog%, ")
                 numEstrategiasDesconocidas += 1
              End If

           End If
                      

           If sMsgValidacion.Length > 0 then 
             sMsgValidacion.Remove (sMsgValidacion.Length - 2, 2 )
           End If

           transaccion.MsgValidacion = sMsgValidacion.ToString ()         
           sMsgValidacion.Clear ()


        Next


        If numMensajesError > 0 then 
           Return False 
        Else 
           Return True  
        End If


    Catch ex As Exception
    
       sMsgError = ex.Message 
       Return False 
    End Try



End Function

Public Function GenerarArchivoTL(ByRef lstTransacciones As List(Of CTOrdenMarketListed),ByRef nomArchivo As String,ByRef sMsgError As String) As Boolean 


  Dim file                As System.IO.StreamWriter    
  Dim auxTran             As StringBuilder = New StringBuilder ()
  Dim index               As Integer = 1
  Dim sNomArchivoCompleto As String 
  Dim fechaActual         As Date 

  Try
        
        fechaActual = CServiciosMacrosSyBaseDB.FechaHoyDB () 
        sNomArchivoCompleto  = "U" & CServiciosMacrosSyBaseDB.IDUSUARIO & "_" & NOMBRE_ARCHIVO_TL & fechaActual.Year & fechaActual.Month & fechaActual.Day & fechaActual.Hour & fechaActual.Minute & fechaActual.Second & ".tl"
        
        file = My.Computer.FileSystem.OpenTextFileWriter(RUTA_ARCHIVO_TL & sNomArchivoCompleto, True)

        file.WriteLine()
        For Each trans as CTOrdenMarketListed in lstTransacciones 

           trans.IdTran    = index  

           auxTran.Append (index  & vbTab & "ENTITE" & vbTab & __ENTITE__)
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "PF_COD" & vbTab & trans.Portafolio)
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "INST_ACR" & vbTab & trans.Instrumento.Replace ("_","")) 'Se eliminan los guiones bajos
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "XACT_TYP" & vbTab & trans.TipoTran)
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "INST_QTY" & vbTab & trans.CantidadTit)
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "INST_PRICE" & vbTab & trans.Precio)
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "XACT_DAT" & vbTab & trans.FecTran) 
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "SETTLE_DAT" & vbTab & trans.FecLiq) 
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "BROKER_COD" & vbTab & trans.Broker) 
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "QUOTE_MOD" & vbTab & ValoresDefault.QuoteMode) 
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "QTY_EXPR" & vbTab & ValoresDefault.QtyExpresion  ) 
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "STRATEGY_COD" & vbTab & trans.Strategia) 
           auxTran.AppendLine ()
           auxTran.Append (index  & vbTab & "EXT_REF" & vbTab & __DESCRIPCION_FUN__)      





           file.WriteLine(auxTran.ToString ()) 
           auxTran.Clear () 

           index += 1
        Next

        file.WriteLine()
        
        file.Close()
  
         nomArchivo = sNomArchivoCompleto
         Return true
  Catch ex As Exception
     nomArchivo = ""
     sMsgError = ex.Message 
     Return False 
  End Try

  

End Function

Public Function GenerarTransaccionesLISTEDDECALOG(ByVal nomArchivoTLCompleto As String) As Boolean 

   Dim comando    As String  = RUTA_ARCHIVO_TL & COMANDO_TLOADER  
   Dim argumentos As String  = PARAMETROS_TLOADER.Replace ("@Usuario",CServiciosMacrosSyBaseDB.USUARIO).Replace ("@archivosalida",RUTA_ARCHIVO_TL & nomArchivoTLCompleto) 

   Return  EjecutarProceso(comando,argumentos)

 
End Function

Public function EjecutarProceso (ByVal comando As String, ByVal argumentos As String) As Boolean 

   Dim proceso As New Process()

   Try
       proceso.EnableRaisingEvents = True
       proceso.StartInfo.FileName = comando
       proceso.StartInfo.Arguments = argumentos
       proceso.Start()       
       proceso.Close ()                                       
       Return True  

   Catch ex As Exception       
        Return false
   End Try

    
End Function 

Public Function AlmacenarLogDeTransaccionesLISTED(ByRef lstTransacciones As List(Of CTOrdenMarketListed),ByVal nomArchivo As String,  ByRef sMsgError As String) As Boolean
       
      if CServicioLocalSQLServerDB.AlmacerLogTransaccionesListedDB (lstTransacciones,nomArchivo,sMsgError) = True   then 
         'Guardar información reelevante en Bitácora (principalmente: mensaje cuando la estrategia no se encuentre y así se envie)
         Return True 
      else
          'Almacenar en Bitácora el error
          Return false
      End If
                      
End Function

Public Function ObtenerTransacLogXPeriodo(ByVal sFechaIni As String, ByVal sFechaFin As String, ByRef sMsgError As String) As List(Of CTLogTransacciones) 
   
   Dim lstTransacLog  = New  List(Of CTLogTransacciones) 
   Dim dt  As DataTable = Nothing 
 
   dt = CServicioLocalSQLServerDB.ObtenerPEDDistribParaActualizarFolioDec(sFechaIni,sFechaFin,sMsgError)   
   If dt is Nothing then 
     Return New  List(Of CTLogTransacciones)
   End If

   Try

      For Each tran As DataRow  In dt.Rows

           Dim tranListed = New CTLogTransacciones  ()

           With tranListed

               .IdGpoTran   = tran("ID_GPO_TRAN")
               .IdTran      = tran("ID_TRAN")

               .Portafolio  = tran("PORTAFOLIO")
               .Instrumento = tran("INSTRUMENTO")
               .Precio      = tran("PRECIO")
               .CantidadTit = tran("CANTIDAD_TIT")
               .TipoTran    = tran("TIPO_TRAN")
               .Strategia   = tran("ESTRATEGIA")
               .FecTran     = tran("FEC_TRAN")
               .FecLiq      = tran("FEC_LIQ")
               .Broker      = tran("BROKER")
                  
               .FechaRegistro = tran("FEC_REGISTRO")
               .FolioDecalog  = tran("FOLIO_DEC")
               .MsgValidacion = tran("DESCRIPCION")

               .NomArchivo    = tran ("NOM_ARCHIVO")
               .NomUsuario    = tran("NOMUSU")
                                          
           End With

           lstTransacLog.Add (tranListed)

      Next

     Return lstTransacLog 

   Catch ex As Exception
      sMsgError = ex.Message 
      Return New List(Of CTLogTransacciones)
   End Try
    
End Function

Public function  CargarArchivosRespuestaDecalog(ByRef lstTransac As List(Of  CTLogTransacciones), ByRef sMsgError As String, ByRef eventoBit As CSBitEvento  ) As Boolean 

 Dim textOK As String = ".ok_text"
 Dim textERR As String = ".err_text"
 Dim strAux  As String 
 Dim lote   As Integer 



 Dim lstResp = New List(Of CTRespuestaDecalog )
 

 Dim infoRespTot = New StringBuilder ()


 Dim lstNomArchivos = From transac In  lstTransac Select transac.NomArchivo    Distinct  
       

 Try

   For Each archivo As String in  lstNomArchivos
        
        '1. Respuesta correcta OK

         Dim archivoExtOK As String  = RUTA_ARCHIVO_TL & archivo & textOK 
         Dim nomAuxArchivoOK As String = archivo 
         If File.Exists(archivoExtOK) Then

                lote =  lstTransac.Find (Function (x) x.NomArchivo.Equals (nomAuxArchivoOK)).IdGpoTran 
                                       
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(archivoExtOK)

                If infArchivoTextoOK.Length > 0 Then
                    Dim srArchivoOk = New StreamReader(archivoExtOK)

                    While Not srArchivoOk.EndOfStream
                        strAux = srArchivoOk.ReadLine()
                        If strAux.Count > 0 then 

                             Dim infoResp = New  CTRespuestaDecalog                                
                             With infoResp
                                .TipoRespuesta = CTRespuestaDecalog.RespuestaDecalog.OK_TEXT 
                                .IdGpoTran = lote 
                                .IdTran = RegresarCadenaNumericaIndex (0,strAux)
                                .NomArchivo = archivo                                 
                                .Valor  = RegresarCadenaNumericaIndex (strAux.IndexOf("["),strAux)
                             End With                             
                             lstResp.Add (infoResp)

                        End If                        
                    End While
                    
                    srArchivoOk.Close()
                                   
                End If
           
            Else                 

               sMsgError &= "Archivo no encontrado (tl_ok_text): " & archivoExtOK & vbCrLf 
               Dim errorBit = eventoBit.GuardarError ("Archivo no encontrad0 (tl_ok_text): " & archivoExtOK )
            End If    



           '2 Respuesta con error ERR


         Dim archivoExtERR As String  = RUTA_ARCHIVO_TL & archivo & textERR  
         Dim nomAuxArchivoERR As String = archivo 
         If File.Exists(archivoExtERR ) Then

               lote =  lstTransac.Find (Function (x) x.NomArchivo.Equals (nomAuxArchivoERR)).IdGpoTran 
                                       
                Dim infArchivoTextoERR As FileInfo = My.Computer.FileSystem.GetFileInfo(archivoExtERR)

                If infArchivoTextoERR.Length > 0 Then
                    Dim srArchivoERR = New StreamReader(archivoExtERR)

                    While Not srArchivoERR.EndOfStream
                        strAux = srArchivoERR.ReadLine()
                                                                        
                        If strAux.Count > 0 then 

                             Dim infoResp = New  CTRespuestaDecalog                                

                             infoResp.IdGpoTran = lote 
                             infoResp.NomArchivo = archivo                                 

                             infoResp.TipoRespuesta = CTRespuestaDecalog.RespuestaDecalog.ERR_TEXT 
  
                             infoResp.IdTran = RegresarCadenaNumericaIndex (0,strAux)
                             
                             strAux = srArchivoERR.ReadLine()
                             strAux = srArchivoERR.ReadLine()
                                                          
                             infoResp.Valor  = strAux
                               
                             lstResp.Add (infoResp)

                        End If                        
                    
                    End While

                    
                    srArchivoERR.Close()
                                   
                End If
           
            Else    
               sMsgError &= "Archivo no encontrado (tl_err_text): " & archivoExtERR & vbCrLf              
               Dim errorBit = eventoBit.GuardarError ("Archivo no encontrado (tl_err_text): " & archivoExtERR)
            End If    


   Next
  

   Dim sMsgErrorDB As String = ""
   If CServicioLocalSQLServerDB.AlmacenarRespuestaDecalogTranListed (lstResp, sMsgErrorDB) = True then         
        Return true
   Else 
        sMsgError &= "Error en DB:" & sMsgErrorDB 
        Dim errorBit = eventoBit.GuardarError ("Error en DB:" & sMsgErrorDB )
        Return False 
   End If
   

Catch ex As Exception   
   sMsgError = ex.Message 
   Dim errorBit = eventoBit.GuardarError ("Excepción en CargarArchivosRespuestaDecalog: "  & sMsgError)
   Return false
End Try



 
End Function

Public Function ValidarTEAvsTEC(ByRef lstTransacciones As List(Of CTOrdenMarketListed)) As Decimal
  
  Dim totalTEA  = (From t As CTOrdenMarketListed In lstTransacciones Where t.TipoTran.Equals (__TIPO_TRAN_TEA__) Select (t.CantidadTit * t.Precio )).Sum  
  Dim totalTEC  = (From t As CTOrdenMarketListed In lstTransacciones Where t.TipoTran.Equals (__TIPO_TRAN_TEC__) Select (t.CantidadTit * t.Precio )).Sum  

  Return    (totalTEA - totalTEC)

End Function

Public Function RegresarCadenaNumericaIndex(ByVal index As Integer, ByRef cadena As String) As String 

Dim numero  = New StringBuilder ("")
Dim EsNumero As Boolean = false

If index < 0 or cadena is Nothing  then 
   Return ""
End If

Dim i = 0
For i = index  to cadena.Count - 1 
     If IsNumeric (cadena.ElementAt (i)) then 
         EsNumero = True     
         numero.Append(cadena.ElementAt (i))
     elseif EsNumero = true then 
           Exit For 
     End If
Next


Return numero.ToString ()

End Function



#End Region






End Class




